import axios from 'axios';
import API_LIST from 'src/API_LIST';
import store from 'src/vuex/store';
import router from 'src/router';

// 请求拦截器
axios.interceptors.request.use(axiosRequestResolve, axiosRequestReject);

// 响应拦截器
axios.interceptors.response.use(axiosResponseResolve, axiosResponseReject);

/**
 * 请求发出前处理
 * @param {Object} config
 * @return {*}
 */
function axiosRequestResolve(config){
    let token = store.getters['userToken/getToken'];

    // @see {@link https://github.com/mzabriskie/axios/issues/209}
    if(token) config.headers.Authorization =  `Bearer ${token}`;

    return config;
}
/**
 * 对请求错误处理后件
 */
function axiosRequestReject(error){
    return Promise.reject(error);
}

/**
 * 对响成功处理
 * @param response
 * @return {*}
 */
function axiosResponseResolve(response){
    
    checkTokenValidateReload(response);

    return response;
}

/**
 * 发现 token 失效则删除 cookie reload 页面， route 会自动处理重定向到 login 页面
 * @param response
 */
function checkTokenValidateReload(response) {
    if (response.data &&
        parseInt(response.data.code) === API_LIST.TOKEN_ERROR_CODE
    ) {
        store.commit('userToken/deleteToken');
        router.push({name:'login'});
    }
}

/**
 * 响应错误处理
 * @param error
 * @return {Promise.<*>}
 */
function axiosResponseReject(error){
    return Promise.reject(error);
}

export default axios;